最近在看metric learning 相關的東西,
再次複習了一次Triplet Loss>
Triplet Loss 首次提出是在Google的人臉辨識論文FaceNet,FaceNet: A Unified Embedding for Face Recognition and Clustering
它的概念十分簡單:
讓同類盡可能靠近,不同類盡可能遠離
它的基本單位是一組triplet(Anchor, Positive, Negative),
先從dataset選出一個Anchor,然後挑選一個同類的作為Positive,挑選一個不同類的作為Negative,
最終的優化目標是拉近(A,P)的距離,拉遠(A,P)的距離,寫成式子:
他們兩兩的距離還需要差一個margin。
T是所有可能的Triplet組合
但實際上我們很難使用所有的Triplet來訓練,這樣會收斂很慢,
因為Triplet 可分為三類:esay/semi-hard/hard
關係如下圖,
通常大部分的是easy triplet,對優化沒有太大的幫助,
而hard sample有時候會太困難,直接優化可能導致模型泛化能力變差。
FaceNet 中是隨機選取semi-hard triplets 進行訓練的。
Triplets採樣有很多種變化,也可以挑semi-hard/hard一起優化,
或是早期優化easy triplet,晚期優化hard triplet。
FaceNet是對經過CNN抽取的emedding特徵進行triplet loss計算。
不過實務上很多人說triplet實在很難train,要花時間調參數才會收斂,
所以目前也比較少人直接使用triplet loss,
通常會搭配softmax類型的loss一起train。